package sql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import core.Aluno;
import core.Professor;
import core.Curso;

import sql.ProfessorException;

public class ProfessorBD {
	
	private Connection con;
	
	public ProfessorBD() {
		try {
			Class.forName(BancoDados.driverJDBC);
			con = DriverManager.getConnection(BancoDados.dbMySQL, BancoDados.usuario, BancoDados.senha);
			con.setAutoCommit( false );
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void close() {
		try {
			
			Class.forName(BancoDados.driverJDBC);
			con.commit();
			con.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
	
	public void addProfessor( String nome, String matricula ) throws ProfessorException {
		Statement st;
		
		if( existeProfessorNome(nome) ) {
			throw new ProfessorException( "Nome do Professor já existe." );
		}
		
		if( existeProfessorMatricula(matricula) ) {
			throw new ProfessorException( "Matricula do Professor já existe." );
		}
		
		try {
			
			st = con.createStatement();
			st.execute( comandoCadastraProfessor(nome, matricula) );
			
			con.commit();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public ArrayList<Professor> getProfessores( String nomeProfessor ) throws ConexaoException {
		Statement st;
		ResultSet rs;
		
		ArrayList<Professor> lstProfessor = new ArrayList<Professor>();
		
		try {
			
			st = con.createStatement();
			rs = st.executeQuery( comandoPesquisaProfessor( nomeProfessor ) );
			
			while( rs.next() ) {
				
				Professor tempProfessor = new Professor( rs.getString("nome"), rs.getString("matricula") );
				
				lstProfessor.add( tempProfessor );
				
				con.commit();
				
			}
		} catch (SQLException e) {
			throw new ConexaoException( e.getMessage() );
		}
		
		return lstProfessor;
	}
	
	public Professor getProfessor( String matricula ) throws ProfessorException {
		Statement st;
		ResultSet rs;
		Professor tempProfessor = new Professor();
		
		if( ! existeProfessorMatricula(matricula) ) {
			throw new ProfessorException("Matricula Professor não existe.");
		}
		
		try {
			
			st = con.createStatement();
			rs = st.executeQuery( comandoProfessorMatricula(matricula) );
			
			if( rs.next() ) {
				
				tempProfessor.setNome( rs.getString("nome") );
				tempProfessor.setMatricula( rs.getString("matricula") );
				
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return tempProfessor;
	}
	
	public void delProfessor( String matricula ) throws ProfessorException {
		Statement st;
		
		if( !existeProfessorMatricula(matricula) ) {
			throw new ProfessorException( "Matricula não existe." );
		}
		
		try {
			
			st = con.createStatement();
			st.execute( comandoRemoveProfessorMatricula( matricula ));
			con.commit();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public boolean updateProfessor( Professor professor, String matriculaAntiga ) { 
		Statement st;

		try {
			
			st = con.createStatement();
			st.execute( comandoAtualizaProfessor( professor.getNome(), professor.getMatricula(), matriculaAntiga ) );

			con.commit();

		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return true;
	}
	
	public Professor getProfessorPorID( int idProfessor ) {
		Statement st;
		ResultSet rs;
		
		try {
			
			st = con.createStatement();
			rs = st.executeQuery( comandoPesquisaProfessorPorID( idProfessor ) );
			
			if( rs.next() ) {
				
				Professor tempProfessor = new Professor( rs.getString("nome"), rs.getString("matricula") );
				return tempProfessor;
				
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public int getIDProfessor( Professor professor ) throws ProfessorException {
		Statement st;
		ResultSet rs;
		
		int resultado = -1;
		
		if( professor == null ) {
			return resultado;
		}
		
		try {
			st = con.createStatement();
			rs = st.executeQuery( comandoProfessorID( professor.getNome() , professor.getMatricula() ) );
			
			
			if( rs.next() ) {
				resultado = rs.getInt( "id" );
			}
			
			if( resultado < 0 ) {
				throw new ProfessorException( "Não foi possível obter ID do Professor." );
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return resultado;
	}

	private boolean existeProfessorNome(String nome) {

		Statement st;
		ResultSet rs;

		try {
			
			st = con.createStatement();
			rs = st.executeQuery( comandoNomeProfessor( nome ) );
			
			int resultado = -1;
			
			if( rs.next() ) {
				resultado = rs.getInt( "id" );
			}
			
			con.commit();
			
			if( resultado < 1 ) {
				return false;
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return true;
	}

	private boolean existeProfessorMatricula( String matricula ) {

		Statement st;
		ResultSet rs;

		try {

			st = con.createStatement();
			rs = st.executeQuery( comandoMatriculaProfessor(matricula) );

			int resultado = -1;

			if( rs.next() ) {
				resultado = rs.getInt( "id" );
			}

			con.commit();

			if( resultado < 1 ) {
				return false;
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}

		return true;

	}
	
	private String comandoAtualizaProfessor(String nome, String matricula, String matriculaAntiga ) {
		return "UPDATE professor SET nome = '" + nome + "' , matricula = '" + matricula + "' WHERE STRCMP ( matricula , '" + matriculaAntiga + "' ) = 0 ;";
	}
	
	private String comandoProfessorMatricula( String matricula ) {
		return "SELECT * FROM professor WHERE STRCMP ( matricula , '" + matricula + "' ) = 0 ;";
	}
	
	private String comandoRemoveProfessorMatricula( String matricula ) {
		return "DELETE from professor WHERE STRCMP ( matricula , '" + matricula + "' ) = 0 ;";
	}
	
	private String comandoPesquisaProfessor( String nome ) {
		return "SELECT * FROM professor WHERE nome LIKE '%" + nome + "%' ;";
	}
	
	private String comandoNomeProfessor( String nome ) {
		return "SELECT id FROM professor WHERE STRCMP ( nome , '" + nome + "' ) = 0 ;";
	}
	
	private String comandoMatriculaProfessor( String matricula ) {
		return "SELECT id FROM professor WHERE STRCMP ( matricula , '" + matricula + "' ) = 0 ;";
	}
	
	private String comandoCadastraProfessor( String nome, String matricula ) {
		return "INSERT INTO professor VALUES ( NULL, '" + nome + "', '" + matricula + "' ) ;";
	}
	
	private String comandoPesquisaProfessorPorID( int id ) {
		return "SELECT * FROM professor WHERE id = " + id + " ;";
	}
	
	private String comandoProfessorID( String nome, String matricula ) {
		return "SELECT id FROM professor WHERE STRCMP ( nome , '" + nome + "' ) = 0 AND STRCMP ( matricula , '" + matricula + "' ) = 0 ;";
	}
}
